/**
 * 业务相关工具函数
 * 提供项目中业务逻辑相关的工具函数
 */

import { ROLE_COLOR_MAP } from '@/constants/business';
import type { Department } from '@/types/rbac';

/**
 * 获取角色信息
 * @param roleId 角色ID
 * @returns 角色信息
 */
export const getRoleInfo = (roleId: string) => {
  // 移除mock数据依赖，改为从API获取或使用默认值
  return { 
    name: roleId, 
    color: (ROLE_COLOR_MAP as Record<string, string>)[roleId] || 'blue' 
  };
};

/**
 * 获取部门信息（递归查找）
 * @param deptId 部门ID
 * @param departments 部门数据数组
 * @returns 部门信息
 */
export const getDepartmentInfo = (deptId: string, departments: Department[] = []) => {
  const findDept = (depts: Department[]): Department | undefined => {
    for (const dept of depts) {
      if (dept.id === deptId) return dept;
      if (dept.children) {
        const found = findDept(dept.children);
        if (found) return found;
      }
    }
    return undefined;
  };
  return findDept(departments);
};

/**
 * 获取团队信息
 * @param teamId 团队ID
 * @param teams 团队数据数组
 * @returns 团队信息
 */
export const getTeamInfo = (teamId: string, teams: any[] = []) => {
  return teams.find(t => t.id === teamId);
};

/**
 * 获取团队信息（保持向后兼容）
 * @param groupId 团队ID（旧参数名）
 * @param teams 团队数据数组
 * @returns 团队信息
 * @deprecated 请使用 getTeamInfo 替代
 */
export const getGroupInfo = (groupId: string, teams: any[] = []) => {
  return getTeamInfo(groupId, teams);
};

/**
 * 构建部门选择树数据
 * @param departments 部门数据
 * @returns 选择树数据
 */
export const buildDepartmentSelectData = (departments: Department[]): any[] => {
  return departments.map(dept => ({
    title: dept.name,
    value: dept.id,
    children: dept.children ? buildDepartmentSelectData(dept.children) : [],
  }));
};

/**
 * 获取所有部门ID（递归）
 * @param departments 部门数据
 * @returns 部门ID数组
 */
export const getAllDepartmentIds = (departments: Department[]): string[] => {
  let ids: string[] = [];
  departments.forEach(dept => {
    ids.push(dept.id);
    if (dept.children && dept.children.length > 0) {
      ids = ids.concat(getAllDepartmentIds(dept.children));
    }
  });
  return ids;
};

/**
 * 获取状态颜色
 * @param status 状态值
 * @returns 颜色字符串
 */
// 状态颜色映射
export const getStatusColor = (status: string | number): string => {
  const statusMap: Record<string, string> = {
    'active': 'success',
    'disabled': 'default',
    '1': 'success',
    '0': 'default',
  };
  return statusMap[String(status)] || 'default';
};

// 状态文本映射
export const getStatusText = (status: string | number): string => {
  const statusMap: Record<string, string> = {
    'active': '启用',
    'disabled': '禁用',
    '1': '启用',
    '0': '禁用',
  };
  return statusMap[String(status)] || '未知';
};

/**
 * 过滤数据的通用函数
 * @param data 数据数组
 * @param searchText 搜索文本
 * @param searchFields 搜索字段
 * @returns 过滤后的数据
 */
export const filterData = <T extends Record<string, any>>(
  data: T[], 
  searchText: string, 
  searchFields: (keyof T)[]
): T[] => {
  if (!searchText) return data;
  
  const lowerSearchText = searchText.toLowerCase();
  return data.filter(item =>
    searchFields.some(field => {
      const value = item[field];
      return value && String(value).toLowerCase().includes(lowerSearchText);
    })
  );
};

/**
 * API延迟工具（开发时使用）
 * @param ms 延迟时间（毫秒）
 * @returns Promise
 */
export const apiDelay = (ms: number = 1000): Promise<void> => 
  new Promise(resolve => setTimeout(resolve, ms));

/**
 * 格式化业务编号
 * @param prefix 前缀
 * @param number 数字
 * @param length 总长度
 * @returns 格式化后的编号
 */
export const formatBusinessNumber = (prefix: string, number: number, length: number = 6): string => {
  return prefix + String(number).padStart(length, '0');
};

/**
 * 解析业务编号
 * @param businessNumber 业务编号
 * @param prefix 前缀
 * @returns 数字部分
 */
export const parseBusinessNumber = (businessNumber: string, prefix: string): number => {
  return parseInt(businessNumber.replace(prefix, ''), 10) || 0;
};

/**
 * 获取优先级颜色
 * @param priority 优先级
 * @returns 颜色字符串
 */
export const getPriorityColor = (priority: string): string => {
  const priorityMap: Record<string, string> = {
    'low': 'green',
    'medium': 'blue',
    'high': 'orange',
    'urgent': 'red',
    'critical': 'red',
  };
  return priorityMap[priority] || 'default';
};

/**
 * 获取优先级文本
 * @param priority 优先级
 * @returns 优先级文本
 */
export const getPriorityText = (priority: string): string => {
  const priorityMap: Record<string, string> = {
    'low': '低',
    'medium': '中',
    'high': '高',
    'urgent': '紧急',
    'critical': '严重',
  };
  return priorityMap[priority] || priority;
};

/**
 * 获取工单类型颜色
 * @param type 工单类型
 * @returns 颜色字符串
 */
export const getTicketTypeColor = (type: string): string => {
  const typeMap: Record<string, string> = {
    'technical': 'blue',
    'business': 'green',
    'billing': 'orange',
    'other': 'default',
  };
  return typeMap[type] || 'default';
};

/**
 * 获取工单类型文本
 * @param type 工单类型
 * @returns 类型文本
 */
export const getTicketTypeText = (type: string): string => {
  const typeMap: Record<string, string> = {
    'technical': '技术问题',
    'business': '业务咨询',
    'billing': '账单问题',
    'other': '其他',
  };
  return typeMap[type] || type;
};

/**
 * 计算完成率
 * @param completed 已完成数量
 * @param total 总数量
 * @returns 完成率（百分比）
 */
export const calculateCompletionRate = (completed: number, total: number): number => {
  if (total === 0) return 0;
  return Math.round((completed / total) * 100);
};

/**
 * 获取进度状态
 * @param rate 进度率
 * @returns 进度状态
 */
export const getProgressStatus = (rate: number): 'success' | 'active' | 'exception' => {
  if (rate >= 100) return 'success';
  if (rate >= 80) return 'active';
  return 'exception';
};

/**
 * 生成头像URL
 * @param name 姓名
 * @param size 尺寸
 * @returns 头像URL
 */
export const generateAvatarUrl = (name: string, size: number = 40): string => {
  const firstChar = name.charAt(0).toUpperCase();
  return `https://ui-avatars.com/api/?name=${encodeURIComponent(firstChar)}&size=${size}&background=1890ff&color=fff`;
};

/**
 * 获取文件类型图标
 * @param filename 文件名
 * @returns 图标名称
 */
export const getFileTypeIcon = (filename: string): string => {
  const ext = filename.split('.').pop()?.toLowerCase();
  const iconMap: Record<string, string> = {
    'pdf': 'FilePdfOutlined',
    'doc': 'FileWordOutlined',
    'docx': 'FileWordOutlined',
    'xls': 'FileExcelOutlined',
    'xlsx': 'FileExcelOutlined',
    'ppt': 'FilePptOutlined',
    'pptx': 'FilePptOutlined',
    'jpg': 'FileImageOutlined',
    'jpeg': 'FileImageOutlined',
    'png': 'FileImageOutlined',
    'gif': 'FileImageOutlined',
    'zip': 'FileZipOutlined',
    'rar': 'FileZipOutlined',
    'txt': 'FileTextOutlined',
  };
  return iconMap[ext || ''] || 'FileOutlined';
};

/**
 * 检查权限
 * @param userPermissions 用户权限列表
 * @param requiredPermission 需要的权限
 * @returns 是否有权限
 */
export const hasPermission = (userPermissions: string[], requiredPermission: string): boolean => {
  return userPermissions.includes(requiredPermission) || userPermissions.includes('*');
};

/**
 * 检查任意权限
 * @param userPermissions 用户权限列表
 * @param requiredPermissions 需要的权限列表
 * @returns 是否有任意权限
 */
export const hasAnyPermission = (userPermissions: string[], requiredPermissions: string[]): boolean => {
  return requiredPermissions.some(permission => hasPermission(userPermissions, permission));
};

/**
 * 检查所有权限
 * @param userPermissions 用户权限列表
 * @param requiredPermissions 需要的权限列表
 * @returns 是否有所有权限
 */
export const hasAllPermissions = (userPermissions: string[], requiredPermissions: string[]): boolean => {
  return requiredPermissions.every(permission => hasPermission(userPermissions, permission));
};